package traveldreampm.ejb.manager;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.*;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import traveldreampm.ejb.dtos.*;
import traveldreampm.ejb.entities.*;

/**
 * Session Bean implementation class GestoreProdotti
 */
@Stateless
public class GestoreProdotti implements GestoreProdottiLocal {

	@PersistenceContext
    private EntityManager em;
	
	@Resource
	private EJBContext context;
	
	public GestoreProdotti() {}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void addProdotto(ProdottoDTO prodotto) {
		Prodotto newProdotto = new Prodotto();

		newProdotto.setNome(prodotto.getNome());
		newProdotto.setDescrizione(prodotto.getDescrizione());
		newProdotto.setPrezzoUnitario(prodotto.getPrezzoUnitario());
		newProdotto.setTipologia(prodotto.getTipologia());
		newProdotto.setCreatore(em.find(Utente.class, prodotto.getIdCreatore()));
		
		em.persist(newProdotto);
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void modifyProdotto(ProdottoDTO prodotto) {
		Prodotto prodottoDaMod = this.getProdottoFromId(prodotto.getIdProdotto());
		
		prodottoDaMod.setNome(prodotto.getNome());
		prodottoDaMod.setDescrizione(prodotto.getDescrizione());
		prodottoDaMod.setPrezzoUnitario(prodotto.getPrezzoUnitario());
		prodottoDaMod.setTipologia(prodotto.getTipologia());
		
		em.merge(prodottoDaMod);
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void removeProdotto(ProdottoDTO prodotto){
		em.remove(this.getProdottoFromId(prodotto.getIdProdotto()));
		em.flush();
		em.getEntityManagerFactory().getCache().evictAll();
	}
	
	@Override
	public int calcolaPrezzoTotale(int idProdotto, int numDays) {
		Prodotto prod = this.getProdottoFromId(idProdotto);
		
		if (prod == null)
			return 0;
		else if (prod.getTipologia()==TipologiaProdotto.HOTEL)
			return prod.getPrezzoUnitario()*numDays;
		else
			return prod.getPrezzoUnitario();
		
	}
	
	@Override
	public List<ProdottoDTO> getProdotti() {
		List<Prodotto> listaProdotti = em.createNamedQuery("Prodotto.findAll", Prodotto.class).getResultList();
		List<ProdottoDTO> listaProdottiDTO = new ArrayList<ProdottoDTO>();
		
		for (Prodotto prod : listaProdotti) {
			listaProdottiDTO.add(convertToDTO(prod));
		}
		
		return listaProdottiDTO;
	}
	
	@Override
	public ProdottoDTO getProdottoDTOFromId(int idProdotto) {
		return this.convertToDTO(this.getProdottoFromId(idProdotto));
	}

	private Prodotto getProdottoFromId(int idProdotto) {
		return em.find(Prodotto.class, idProdotto);
	}
	
	private ProdottoDTO convertToDTO(Prodotto prodotto) {
		if (prodotto == null)
			return null;
		
		ProdottoDTO prodDTO = new ProdottoDTO();
		
		prodDTO.setIdProdotto(prodotto.getIdProdotto());
		prodDTO.setNome(prodotto.getNome());
		prodDTO.setDescrizione(prodotto.getDescrizione());
		prodDTO.setIdCreatore(prodotto.getCreatore().getIdUtente());
		prodDTO.setPrezzoUnitario(prodotto.getPrezzoUnitario());
		prodDTO.setTipologia(prodotto.getTipologia());
		
		return prodDTO;
	}
}
